using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes.DomainAttributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Enums;
using System.Collections.Generic;
using System.ComponentModel;

namespace Baci.ArcGIS._ModelTools._Iterator
{
    /// <summary>
    /// <para>Iterate Layers</para>
    /// <para>Iterates layers in a map.</para>
    /// <para>迭代地图中的图层。</para>
    /// </summary>    
    [DisplayName("Iterate Layers")]
    public class IterateLayers : AbstractGPProcess
    {
        /// <summary>
        /// 无参构造
        /// </summary>
        public IterateLayers()
        {

        }

        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="_input_map">
        /// <para>Input Map</para>
        /// <para>The input map with the layers to iterate.</para>
        /// <para>包含要迭代的图层的输入映射。</para>
        /// </param>
        public IterateLayers(object _input_map)
        {
            this._input_map = _input_map;
        }
        public override string ToolboxName => "Model Tools";

        public override string ToolName => "Iterate Layers";

        public override string CallName => "mb.IterateLayers";

        public override List<string> AcceptEnvironments => [];

        public override object[] ParameterInfo => [_input_map, _wildcard, _layer_type, _workspace_type, _feature_type, _raster_format_type, _layer_visibility.GetGPValue(), _layer_state.GetGPValue(), _recursive.GetGPValue(), _output_layer, _output_name, _output_layer_type, _output_workspace_type];

        /// <summary>
        /// <para>Input Map</para>
        /// <para>The input map with the layers to iterate.</para>
        /// <para>包含要迭代的图层的输入映射。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input Map")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _input_map { get; set; }


        /// <summary>
        /// <para>Wildcard</para>
        /// <para>A combination of * and characters that help to limit the results. The asterisk is the same as saying ALL. If no wildcard is specified, all inputs will be returned. For example, it can be used to restrict Iteration over input names starting with a certain character or word (for example, A* or Ari* or Land* and so on).</para>
        /// <para>* 和字符的组合，有助于限制结果。星号与说 ALL 相同。如果未指定通配符，则将返回所有输入。例如，它可用于限制对以特定字符或单词开头的输入名称（例如，A* 或 Ari* 或 Land* 等）的迭代。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Wildcard")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _wildcard { get; set; } = null;


        /// <summary>
        /// <para>Layer Type</para>
        /// <para><xdoc>
        ///   <para>Specifies the layer type used to filter the layers. If a layer type is not specified, all supported layer types will be iterated. More than one layer type can be used to filter the layers.</para>
        ///   <bulletList>
        ///     <bullet_item>Annotation Layer—Annotation layers will be iterated.</bullet_item><para/>
        ///     <bullet_item>Building Layer—Building layers will be iterated.</bullet_item><para/>
        ///     <bullet_item>Building Scene Layer— Building scene layers will be iterated.</bullet_item><para/>
        ///     <bullet_item>Dimension Layer—Dimension layers will be iterated.</bullet_item><para/>
        ///     <bullet_item>Feature Layer—Feature layers will be iterated.</bullet_item><para/>
        ///     <bullet_item>Geostatistical Analyst Layer—Geostatistical layers will be iterated.</bullet_item><para/>
        ///     <bullet_item>Group Layer—Group layers will be iterated.</bullet_item><para/>
        ///     <bullet_item>Subtype Group Layer—Subtype group layers will be iterated.</bullet_item><para/>
        ///     <bullet_item>KML Layer—KML layers will be iterated.</bullet_item><para/>
        ///     <bullet_item>LAS Dataset Layer—LAS dataset layers will be iterated.</bullet_item><para/>
        ///     <bullet_item>Mosaic Layer—Mosaic layers will be iterated.</bullet_item><para/>
        ///     <bullet_item>Network Analyst Layer—Network Analyst layers will be iterated.</bullet_item><para/>
        ///     <bullet_item>Network Dataset Layer—Network dataset layers will be iterated.</bullet_item><para/>
        ///     <bullet_item>Parcel Layer—Parcel layers will be iterated.</bullet_item><para/>
        ///     <bullet_item>Raster Layer—Raster layers will be iterated.</bullet_item><para/>
        ///     <bullet_item>Scene Service Layer—Scene service layers will be iterated.</bullet_item><para/>
        ///     <bullet_item>Table View—Table views will be iterated.</bullet_item><para/>
        ///     <bullet_item>Terrain Layer—Terrain layers will be iterated.</bullet_item><para/>
        ///     <bullet_item>TIN Layer—TIN layers will be iterated.</bullet_item><para/>
        ///     <bullet_item>Topology Layer—Topology layers will be iterated.</bullet_item><para/>
        ///     <bullet_item>Trace Network Layer—Trace network layers will be iterated.</bullet_item><para/>
        ///     <bullet_item>Utility Network Layer—Utility network layers will be iterated.</bullet_item><para/>
        ///     <bullet_item>Voxel Layer—Voxel layers will be iterated.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定用于过滤图层的图层类型。如果未指定图层类型，则将迭代所有支持的图层类型。可以使用多种图层类型来过滤图层。</para>
        ///   <bulletList>
        ///     <bullet_item>注记图层—将迭代注记图层。</bullet_item><para/>
        ///     <bullet_item>建筑图层—将迭代建筑图层。</bullet_item><para/>
        ///     <bullet_item>建筑场景图层 - 将迭代建筑场景图层。</bullet_item><para/>
        ///     <bullet_item>尺寸图层 - 将迭代尺寸图层。</bullet_item><para/>
        ///     <bullet_item>要素图层—将迭代要素图层。</bullet_item><para/>
        ///     <bullet_item>Geostatistical Analyst 图层—将迭代地统计图层。</bullet_item><para/>
        ///     <bullet_item>图层组—将迭代图层组。</bullet_item><para/>
        ///     <bullet_item>子类型图层组—将迭代子类型图层组。</bullet_item><para/>
        ///     <bullet_item>KML 图层—将迭代 KML 图层。</bullet_item><para/>
        ///     <bullet_item>LAS 数据集图层—将迭代 LAS 数据集图层。</bullet_item><para/>
        ///     <bullet_item>镶嵌图层—将迭代镶嵌图层。</bullet_item><para/>
        ///     <bullet_item>Network Analyst 图层—将迭代 Network Analyst 图层。</bullet_item><para/>
        ///     <bullet_item>网络数据集图层—将迭代网络数据集图层。</bullet_item><para/>
        ///     <bullet_item>宗地图层—将迭代宗地图层。</bullet_item><para/>
        ///     <bullet_item>栅格图层—将迭代栅格图层。</bullet_item><para/>
        ///     <bullet_item>场景服务图层—将迭代场景服务图层。</bullet_item><para/>
        ///     <bullet_item>表视图—将迭代表视图。</bullet_item><para/>
        ///     <bullet_item>Terrain 图层—将迭代 Terrain 图层。</bullet_item><para/>
        ///     <bullet_item>TIN 层—将迭代 TIN 层。</bullet_item><para/>
        ///     <bullet_item>拓扑图层—将迭代拓扑图层。</bullet_item><para/>
        ///     <bullet_item>追踪网络图层—将迭代追踪网络图层。</bullet_item><para/>
        ///     <bullet_item>公共设施网络图层—将迭代公共设施网络图层。</bullet_item><para/>
        ///     <bullet_item>体素图层—将迭代体素图层。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Layer Type")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public List<object> _layer_type { get; set; } = null;


        /// <summary>
        /// <para>Workspace Type</para>
        /// <para><xdoc>
        ///   <para>Specifies the workspace type used to filter the layers. If a workspace type is not specified, all layers of the supported workspace types will be iterated.</para>
        ///   <para>The Workspace Type parameter is only enabled when the Layer Type parameter is set to Feature Layer, Raster Layer, or Table View.</para>
        ///   <bulletList>
        ///     <bullet_item>Big Data Connection—Layers in a big data connection workspace will be iterated.</bullet_item><para/>
        ///     <bullet_item>BIM File—Layers in a BIM File workspace will be iterated.</bullet_item><para/>
        ///     <bullet_item>CAD—Layers in a CAD workspace will be iterated.</bullet_item><para/>
        ///     <bullet_item>Delimited Text File—Layers in a delimited text file workspace will be iterated.</bullet_item><para/>
        ///     <bullet_item>Enterprise Geodatabase—Layers in a enterprise geodatabase workspace will be iterated.</bullet_item><para/>
        ///     <bullet_item>Feature Service—Layers in a feature service workspace will be iterated.</bullet_item><para/>
        ///     <bullet_item>File Geodatabase—Layers in a file geodatabase workspace will be iterated.</bullet_item><para/>
        ///     <bullet_item>In Memory Database—Layers in an in memory database workspace will be iterated.</bullet_item><para/>
        ///     <bullet_item>Microsoft Excel—Layers in a Microsoft Excel workspace will be iterated.</bullet_item><para/>
        ///     <bullet_item>NetCDF—Layers in a NetCDF workspace will be iterated.</bullet_item><para/>
        ///     <bullet_item>OLE DB—Layers in a OLE DB workspace will be iterated.</bullet_item><para/>
        ///     <bullet_item>Raster—Layers in a raster workspace will be iterated.</bullet_item><para/>
        ///     <bullet_item>Shapefile—Layers in a shapefile workspace will be iterated.</bullet_item><para/>
        ///     <bullet_item>SQLite—Layers in an SQLite workspace will be iterated.</bullet_item><para/>
        ///     <bullet_item>SQL Query Layer—Layers in a SQL query layer workspace will be iterated.</bullet_item><para/>
        ///     <bullet_item>Stream Service—Layers in a stream service workspace will be iterated.</bullet_item><para/>
        ///     <bullet_item>Web Feature Service—Layers in a web feature service workspace will be iterated.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定用于过滤图层的工作空间类型。如果未指定工作空间类型，则将迭代支持的工作空间类型的所有图层。</para>
        ///   <para>仅当图层类型参数设置为要素图层、栅格图层或表视图时，才会启用工作空间类型参数。</para>
        ///   <bulletList>
        ///     <bullet_item>大数据连接—将迭代大数据连接工作空间中的图层。</bullet_item><para/>
        ///     <bullet_item>BIM 文件 - 将迭代 BIM 文件工作空间中的图层。</bullet_item><para/>
        ///     <bullet_item>CAD - 将迭代 CAD 工作空间中的图层。</bullet_item><para/>
        ///     <bullet_item>带分隔符的文本文件 - 将迭代带分隔符的文本文件工作空间中的图层。</bullet_item><para/>
        ///     <bullet_item>企业级地理数据库 - 将迭代企业级地理数据库工作空间中的图层。</bullet_item><para/>
        ///     <bullet_item>要素服务 - 将迭代要素服务工作空间中的图层。</bullet_item><para/>
        ///     <bullet_item>文件地理数据库 - 文件地理数据库工作空间中的图层将被迭代。</bullet_item><para/>
        ///     <bullet_item>在内存数据库中 - 将迭代内存数据库工作空间中的图层。</bullet_item><para/>
        ///     <bullet_item>Microsoft Excel - 将迭代 Microsoft Excel 工作空间中的图层。</bullet_item><para/>
        ///     <bullet_item>NetCDF—将迭代 NetCDF 工作空间中的图层。</bullet_item><para/>
        ///     <bullet_item>OLE DB - 将迭代 OLE DB 工作空间中的图层。</bullet_item><para/>
        ///     <bullet_item>栅格—将迭代栅格工作空间中的图层。</bullet_item><para/>
        ///     <bullet_item>Shapefile—将迭代 shapefile 工作空间中的图层。</bullet_item><para/>
        ///     <bullet_item>SQLite—将迭代 SQLite 工作空间中的图层。</bullet_item><para/>
        ///     <bullet_item>SQL 查询图层 - 将迭代 SQL 查询图层工作空间中的图层。</bullet_item><para/>
        ///     <bullet_item>流服务—将迭代流服务工作空间中的图层。</bullet_item><para/>
        ///     <bullet_item>Web 要素服务 - 将迭代 Web 要素服务工作空间中的图层。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Workspace Type")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public List<object> _workspace_type { get; set; } = null;


        /// <summary>
        /// <para>Feature Type</para>
        /// <para><xdoc>
        ///   <para>Specifies the feature type used to filter the layers. If a feature type is not specified, all supported feature types will be iterated.</para>
        ///   <bulletList>
        ///     <bullet_item>Annotation—Annotation feature classes will be iterated.</bullet_item><para/>
        ///     <bullet_item>Dimension—Dimension feature classes will be iterated.</bullet_item><para/>
        ///     <bullet_item>Simple Edge—Simple edge feature classes will be iterated.</bullet_item><para/>
        ///     <bullet_item>Complex Edge—Complex edge feature classes will be iterated.</bullet_item><para/>
        ///     <bullet_item>Simple Junction—Simple junction feature classes will be iterated.</bullet_item><para/>
        ///     <bullet_item>Complex Junction—Complex junction feature classes will be iterated.</bullet_item><para/>
        ///     <bullet_item>Line—Line feature classes will be iterated.</bullet_item><para/>
        ///     <bullet_item>Point—Point feature classes will be iterated.</bullet_item><para/>
        ///     <bullet_item>Polygon—Polygon feature classes will be iterated.</bullet_item><para/>
        ///     <bullet_item>Multipatch—Multipatch feature classes will be iterated.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定用于过滤图层的要素类型。如果未指定要素类型，则将迭代所有支持的要素类型。</para>
        ///   <bulletList>
        ///     <bullet_item>注记 - 将迭代“注记”要素类。</bullet_item><para/>
        ///     <bullet_item>尺寸—将迭代尺寸要素类。</bullet_item><para/>
        ///     <bullet_item>简单边—将迭代简单边要素类。</bullet_item><para/>
        ///     <bullet_item>复杂边—将迭代复杂边要素类。</bullet_item><para/>
        ///     <bullet_item>简单交汇点—将迭代简单交汇点要素类。</bullet_item><para/>
        ///     <bullet_item>复杂交汇点—将迭代复杂交汇点要素类。</bullet_item><para/>
        ///     <bullet_item>线 - 将迭代线要素类。</bullet_item><para/>
        ///     <bullet_item>点—将迭代点要素类。</bullet_item><para/>
        ///     <bullet_item>面—将迭代面要素类。</bullet_item><para/>
        ///     <bullet_item>多面体—将迭代多面体要素类。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Feature Type")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public List<object> _feature_type { get; set; } = null;


        /// <summary>
        /// <para>Raster Type</para>
        /// <para>The raster format type used to filter the raster layers when the Workspace Type parameter is set to Raster. If a raster type is not specified, all layers of the supported raster types will be iterated.</para>
        /// <para>当工作空间类型参数设置为栅格时，用于过滤栅格图层的栅格格式类型。如果未指定栅格类型，则将迭代支持栅格类型的所有图层。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Raster Type")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public List<object> _raster_format_type { get; set; } = null;


        /// <summary>
        /// <para>Visibility</para>
        /// <para><xdoc>
        ///   <para>Specifies whether layer visibility is used to filter the layers. If layer visibility is not specified, all layers will be iterated.</para>
        ///   <bulletList>
        ///     <bullet_item>Visible—Layer visibility will be used to filter the layers and visible layers will be iterated.</bullet_item><para/>
        ///     <bullet_item>Not Visible—Layer visibility will not be used to filter the layers and nonvisible layers will be iterated.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定是否使用图层可见性来过滤图层。如果未指定图层可见性，则将迭代所有图层。</para>
        ///   <bulletList>
        ///     <bullet_item>可见 - 图层可见性将用于过滤图层，并且将迭代可见图层。</bullet_item><para/>
        ///     <bullet_item>不可见 - 图层可见性将不用于过滤图层，并且将迭代不可见图层。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Visibility")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _layer_visibility_value? _layer_visibility { get; set; } = null;

        public enum _layer_visibility_value
        {
            /// <summary>
            /// <para>Visible</para>
            /// <para>Visible—Layer visibility will be used to filter the layers and visible layers will be iterated.</para>
            /// <para>可见 - 图层可见性将用于过滤图层，并且将迭代可见图层。</para>
            /// </summary>
            [Description("Visible")]
            [GPEnumValue("VISIBLE")]
            _VISIBLE,

            /// <summary>
            /// <para>Not Visible</para>
            /// <para>Not Visible—Layer visibility will not be used to filter the layers and nonvisible layers will be iterated.</para>
            /// <para>不可见 - 图层可见性将不用于过滤图层，并且将迭代不可见图层。</para>
            /// </summary>
            [Description("Not Visible")]
            [GPEnumValue("NOT_VISIBLE")]
            _NOT_VISIBLE,

        }

        /// <summary>
        /// <para>State</para>
        /// <para><xdoc>
        ///   <para>Specifies the layer state that will be used to filter the layers. Layers with broken source path layers are returned if the parameter is set to invalid. If a layer state is not specified, all layers will be iterated.</para>
        ///   <bulletList>
        ///     <bullet_item>Valid—Valid layers will be iterated.</bullet_item><para/>
        ///     <bullet_item>Invalid—Invalid layers will be iterated.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定将用于过滤图层的图层状态。如果参数设置为无效，则返回源路径图层断开的图层。如果未指定图层状态，则将迭代所有图层。</para>
        ///   <bulletList>
        ///     <bullet_item>有效 - 将迭代有效图层。</bullet_item><para/>
        ///     <bullet_item>无效—将迭代无效图层。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("State")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _layer_state_value? _layer_state { get; set; } = null;

        public enum _layer_state_value
        {
            /// <summary>
            /// <para>Valid</para>
            /// <para>Valid—Valid layers will be iterated.</para>
            /// <para>有效 - 将迭代有效图层。</para>
            /// </summary>
            [Description("Valid")]
            [GPEnumValue("VALID")]
            _VALID,

            /// <summary>
            /// <para>Invalid</para>
            /// <para>Invalid—Invalid layers will be iterated.</para>
            /// <para>无效—将迭代无效图层。</para>
            /// </summary>
            [Description("Invalid")]
            [GPEnumValue("INVALID")]
            _INVALID,

        }

        /// <summary>
        /// <para>Recursive</para>
        /// <para><xdoc>
        ///   <para>Specifies whether the iterator will iterate nested group layers.</para>
        ///   <bulletList>
        ///     <bullet_item>Checked—Nested group layers will be iterated.</bullet_item><para/>
        ///     <bullet_item>Unchecked—Nested group layers will not be iterated.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定迭代器是否迭代嵌套图层组。</para>
        ///   <bulletList>
        ///     <bullet_item>选中 - 将迭代嵌套图层组。</bullet_item><para/>
        ///     <bullet_item>未选中 - 不会迭代嵌套图层组。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Recursive")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _recursive_value _recursive { get; set; } = _recursive_value._true;

        public enum _recursive_value
        {
            /// <summary>
            /// <para>RECURSIVE</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("RECURSIVE")]
            [GPEnumValue("true")]
            _true,

            /// <summary>
            /// <para>NOT_RECURSIVE</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("NOT_RECURSIVE")]
            [GPEnumValue("false")]
            _false,

        }

        /// <summary>
        /// <para>Output Layer</para>
        /// <para></para>
        /// <para></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Layer")]
        [Description("")]
        [Option(OptionTypeEnum.derived)]
        public object _output_layer { get; set; }


        /// <summary>
        /// <para>Name</para>
        /// <para></para>
        /// <para></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Name")]
        [Description("")]
        [Option(OptionTypeEnum.derived)]
        public object _output_name { get; set; }


        /// <summary>
        /// <para>Output Layer Type</para>
        /// <para></para>
        /// <para></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Layer Type")]
        [Description("")]
        [Option(OptionTypeEnum.derived)]
        public object _output_layer_type { get; set; }


        /// <summary>
        /// <para>Workspace or Format Type</para>
        /// <para></para>
        /// <para></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Workspace or Format Type")]
        [Description("")]
        [Option(OptionTypeEnum.derived)]
        public object _output_workspace_type { get; set; }


        public IterateLayers SetEnv()
        {
            base.SetEnv();
            return this;
        }

    }

}